/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package FileSystem;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 *
 * @author asfeor
 */
interface Copy
{
    boolean copy (String src, String dest);
}
//Копрует файла или директории со всеми вложенными ресурсами
// src параметр исходной адреса dest параметр пути куда ведется копироввания
// Метод возвращает true если копирование удалось, иначе false
public class CopySome implements Copy {

    @Override
    public boolean copy(String src, String dest) {
   boolean flag=false; 
   if (new File(dest).isDirectory()) {
      File f1=new File(src);
      File f2=new File(dest+File.separator+f1.getName());
    if (f2.exists()) flag = false;  
    else { if (f1.isFile()) {if (copyFile(f1,f2)) flag = true; 
                                else flag = false;}
            if (f1.isDirectory()){ if (copyFolder(f1,new File(dest))) flag =true;
                                    else flag = false;}
    } 
      
    }
    else flag=false;
return flag;
 }
boolean copyFile(File f1, File f2){
  boolean flag=false;
        try {
            f2.createNewFile();
        } catch (IOException ex) {
            return false;
        }
            if (copynio(f1, f2))    flag = true;      
        return flag;
}
boolean copyFolder(File f1, File f2){
if (f2.exists()&&f2.isDirectory()) {
try{ String[] DirList=f1.list();
 int i;
 for (i=0; i<DirList.length; i++){
   if (new File(f1.getAbsoluteFile()+File.separator+DirList[i]).isDirectory()) 
   {   new File(f2.getAbsoluteFile()+File.separator+DirList[i]).mkdir();
     copyFolder(new File(f1.getAbsoluteFile()+File.separator+DirList[i]), 
                   new File(f2.getAbsoluteFile()+File.separator+DirList[i]));  }
   if (new File(f1.getAbsoluteFile()+File.separator+DirList[i]).isFile()) 
                copyFile(new File(f1.getAbsolutePath()+File.separator+DirList[i]),
                           new File (f2.getAbsolutePath()+File.separator+DirList[i]));       
           }
return true;
} catch (NullPointerException e) {return false;}
}
else return false;
}
private boolean copynio(File f1, File f2) {
  boolean flag = false;  
 //создаем и инициализируем каналы
try{
    
    FileInputStream fin = new FileInputStream(f1);
    FileOutputStream fout = new FileOutputStream(f2);
    FileChannel fcin = fin.getChannel();
    FileChannel fcout = fout.getChannel();
 
// выполнить копирование файла
    fcin.transferTo(0, fcin.size(), fcout);
 
// закрываем
    fcin.close();
    fcout.close();
    fin.close();
    fout.close();
    flag = true;
    } catch(IOException ex) {return flag;}
return flag;
    
}
}